package xman.mssh.spring.aop;

public class README {
    /*-
     * AOP
     * 
     * Imperative Programming（命令式编程）: 程序员需要一步步写清楚程序需要如何做什么（How to do What）。 
     * Declarative Programming（声明式编程）: 程序员不需要一步步告诉程序如何做，只需要告诉程序在哪些地方做什么（Where to do What）
     * 
     * Domain Specific Language（领域专用语言，简称DSL）:指一些对应专门领域的高层编程语言，和通用编程语言的概念相对,最常见的DSL就是关系数据库的结构化数据查询语言SQL。
     * SQL也是一门Declarative Programming Language。SQL只需要告诉数据库，处理符合一定条件的数据，而不需要自己一步步判断每一条数据是否符合条件。
     * SQL的形式一般是 select … where …，update … where …，delete … where …。这样一来，很多基层工作，SQL做不了.因此，大部分数据库都提供了另外的Imperative Programming Language，用来编写Stored Procedure（存储过程）等，以便处理一些更加细节的工作。
     * 
     * 
     * 
     * 常见的DSL还有Rule Engine（规则引擎）语言、Workflow（工作流）语言等。 
     * 
     * Rule Engine允许用户按照优先级定义一系列条件组合，并定义对满足条件的数据的处理过程。 
     * 
     * Workflow把最基本的条件判断和循环语句的常见组合，定义为更加高级复杂的常用程序流程逻辑块。
     * 用户可以用这些高级流程块组合更加复杂的流程块，从而定义更加复杂的流程跳转条件。
     * 用户也可以定义当程序运行上下文满足一定条件的时候，应该做什么样的处理工作。 
     * 
     * 
     * AOP = Proxy Pattern + Method Reflection + Aspect DSL + 自动代码生成
     * Aspect Oriented Programming（面向方面编程，简称AOP）是一种Declarative Programming（声明式编程）
     * 自动代码生成:，AOP定义一种Aspect描述的DSL。Aspect DSL的形式有多种多样。有的是一种类似Java的语法，比如AspectJ；有的是XML格式或者各种脚本语言，比如，Spring AOP等。
     * 
     * AOP生成代码有三种可能方式： 
     * 1.静态编译时期，源代码生成。为每个符合条件的类方法产生对应的Proxy对象。AspectJ以前就是这种方式。 
     * 2.静态编译时期，处理编译后的字节码。Java、Python之类的虚拟机语言都有一种中间代码（Java的中间代码叫做字节码），AOP处理程序可以分析字节码，并直接产生字节码形式的Proxy。这种方式也叫做静态字节码增强。AspectJ也支持这种方式。Java有一些开源项目，比如ASM、Cglib等，可以分析并生成Java字节码。这些开源项目不仅可以静态分析增强字节码，还可以在程序运行期动态分析增强字节码。很多AOP项目,比如Spring AOP，都采用ASM/Cglib处理字节码。 
     * 3.动态运行时期，即时处理装载到虚拟机内部的类结构字节码。这也叫做动态增强。比如，Spring AOP。如前所述，Spring AOP使用ASM/Cglib之类的处理字节码的开源项目。
     * Java运行库本身也提供了类似于ASM/Cglib的简单的动态处理字节码的API，叫做Dynamic Proxy。 
     */
}
